home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
STUTTGART
/
LANG
/
LISP
/
XLISP
/
XLISP21S
/
sources
/
c
/
xlisp
< prev
next >
Wrap
Text File
|
1992-04-25
|
6KB
|
221 lines
/* xlisp.c - a small implementation of lisp with object-oriented programming */
/* Copyright (c) 1987, by David Michael Betz
All Rights Reserved
Permission is granted for unrestricted non-commercial use */
/* For full credits see file xlisp.h */
#include "xlisp.h"
/* define the banner line string */
#define BANNER "XLISP-PLUS version 2.1d\n\
Portions Copyright (c) 1988, by David Betz.\n\
Modified by Thomas Almy and others."
/* global variables */
#ifdef SAVERESTORE
jmp_buf top_level;
#endif
/* external variables */
extern LVAL s_stdin,s_stdout,s_evalhook,s_applyhook;
extern LVAL s_1plus,s_2plus,s_3plus,s_1star,s_2star,s_3star,s_minus;
extern int xltrcindent;
extern int xldebug;
extern LVAL true;
extern FILEP tfp;
/* usage - print command line usage, then quit TAA addition */
#ifdef ANSI
VOID usage(void) {
#else
VOID usage() {
#endif
#ifdef SAVERESTORE
fprintf(stderr,"Valid Arguments:\n\t-?\tThis help\n\
\t-tfname\tOpen transcript (dribble) file fname\n\
\t-v\tLoad verbosely\n\
\t-w\tDon't restore from xlisp.wks\n\
\t-wfname\tRestore from fname\n\
\tfname\tLoad file fname\n");
#else
fprintf(stderr,"Valid Arguments:\n\t-?\tThis help\n\
\t-tfname\tOpen transcript (dribble) file fname\n\
\t-v\tLoad verbosely\n\
\tfname\tLoad file fname\n");
#endif
exit(1);
}
/* main - the main routine */
#ifdef ANSI
VOID CDECL main(int argc, char *argv[])
#else
VOID main(argc,argv)
int argc; char *argv[];
#endif
{
char *transcript;
CONTEXT cntxt;
int verbose,i;
LVAL expr;
#ifdef SAVERESTORE
char *resfile = "xlisp.wks"; /* TAA mod -- command line restore file */
#endif
/* setup default argument values */
transcript = NULL;
verbose = FALSE;
/* parse the argument list switches */
#ifndef LSC
for (i = 1; i < argc; ++i)
if (argv[i][0] == '-')
switch(tolower(argv[i][1])) {
case '?': /* TAA MOD: added help */
usage();
case 't':
transcript = &argv[i][2];
break;
case 'v':
verbose = TRUE;
break;
#ifdef SAVERESTORE
case 'w':
resfile = &argv[i][2];
break;
#endif
default: /* Added to print bad switch message */
fprintf(stderr,"Bad switch: %s\n",argv[i]);
usage();
}
#endif
/* initialize and print the banner line */
osinit(BANNER);
/* setup initialization error handler */
xlbegin(&cntxt,CF_TOPLEVEL|CF_CLEANUP|CF_BRKLEVEL,(LVAL)1);
if (setjmp(cntxt.c_jmpbuf))
xlfatal("fatal initialization error");
#ifdef SAVERESTORE
if (setjmp(top_level))
xlfatal("RESTORE not allowed during initialization");
#endif
/* initialize xlisp */
#ifdef SAVERESTORE
i = xlinit(resfile);
#else
i = xlinit(NULL);
#endif
/* reset the error handler, since we know what "true" is */
xlend(&cntxt);
xlbegin(&cntxt,CF_TOPLEVEL|CF_CLEANUP|CF_BRKLEVEL,true);
/* open the transcript file */
if (transcript!=NULL && (tfp = OSAOPEN(transcript,CREATE_WR)) == CLOSED) {
/* TAA Mod -- quote name so "-t foo" will indicate no file name */
sprintf(buf,"error: can't open transcript file: \"%s\"",transcript);
stdputstr(buf);
}
/* load "init.lsp" */
if (i && (setjmp(cntxt.c_jmpbuf) == 0))
xlload("init.lsp",TRUE,FALSE);
/* load any files mentioned on the command line */
if (setjmp(cntxt.c_jmpbuf) == 0)
for (i = 1; i < argc; i++)
if (argv[i][0] != '-' && !xlload(argv[i],TRUE,verbose))
xlerror("can't load file",cvstring(argv[i]));
/* target for restore */
#ifdef SAVERESTORE
if (setjmp(top_level))
xlbegin(&cntxt,CF_TOPLEVEL|CF_CLEANUP|CF_BRKLEVEL,true);
#endif
/* protect some pointers */
xlsave1(expr);
/* main command processing loop */
for (;;) {
/* setup the error return */
if (setjmp(cntxt.c_jmpbuf)) {
setvalue(s_evalhook,NIL);
setvalue(s_applyhook,NIL);
xltrcindent = 0;
xldebug = 0;
xlflush();
}
/* print a prompt */
/* stdputstr("> "); */
if (!redirectin) dbgputstr("> ");
/* read an expression */
if (!xlread(getvalue(s_stdin),&expr))
break;
/* save the input expression */
xlrdsave(expr);
/* evaluate the expression */
expr = xleval(expr);
/* save the result */
xlevsave(expr);
/* Show result on a new line -- TAA MOD to improve display */
xlfreshline(getvalue(s_stdout));
/* print it */
stdprint(expr);
}
xlend(&cntxt);
/* clean up */
wrapup();
}
/* xlrdsave - save the last expression returned by the reader */
VOID xlrdsave(expr)
LVAL expr;
{
setvalue(s_3plus,getvalue(s_2plus));
setvalue(s_2plus,getvalue(s_1plus));
setvalue(s_1plus,getvalue(s_minus));
setvalue(s_minus,expr);
}
/* xlevsave - save the last expression returned by the evaluator */
VOID xlevsave(expr)
LVAL expr;
{
setvalue(s_3star,getvalue(s_2star));
setvalue(s_2star,getvalue(s_1star));
setvalue(s_1star,expr);
}
/* xlfatal - print a fatal error message and exit */
VOID xlfatal(msg)
char *msg;
{
xoserror(msg);
wrapup();
}
/* wrapup - clean up and exit to the operating system */
VOID wrapup()
{
/* $putpatch.c$: "MODULE_XLISP_C_WRAPUP" */
if (tfp != CLOSED)
OSCLOSE(tfp);
osfinish();
exit(0);
}